#!/bin/bash

###############################################
# 网络连通性检测脚本
# 名称：check_network_connectivity.sh
# 版本：1.2
# 作者：YourName
# 日期：2025-03-22
# 描述：
#   定期检查与指定域名或IP的连通性。
#   支持 ping 和 curl 两种方式检测。
#   在断连时发送警报或记录日志。
#   目标地址可通过参数指定。
###############################################

LOG_FILE="$(dirname "$0")/network_connectivity.log"
INTERVAL=5
TARGET="www.google.com"
METHOD="ping"

# 显示标题信息
show_title() {
    echo "=============================="
    echo " 网络连通性检测脚本 "
    echo "=============================="
}

# 解析参数
parse_arguments() {
    if [ $# -gt 0 ]; then
        TARGET="$1"
        echo "使用参数指定的目标地址：$TARGET"
    else
        echo "使用默认目标地址：$TARGET"
    fi
}

# 检查并安装所需工具
check_tools() {
    local tools=(ping curl notify-send)
    echo "正在检查必要工具..."
    sudo apt update
    for tool in "${tools[@]}"; do
        if ! command -v "$tool" &> /dev/null; then
            echo "$tool 未安装，正在自动安装..."
            sudo apt install -y "$tool"
            if ! command -v "$tool" &> /dev/null; then
                echo "$tool 安装失败，请手动安装。"
                exit 1
            fi
            echo "$tool 安装成功！"
        fi
    done
}

# 发送警报通知
send_alert() {
    notify-send "网络连通性警报" "$1"
}

# 连通性检测函数
check_connectivity() {
    local result
    timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    if [ "$METHOD" == "ping" ]; then
        result=$(ping -c 1 "$TARGET" 2>&1)
    else
        result=$(curl -Is --connect-timeout 5 "$TARGET" 2>&1)
    fi
    if [ $? -ne 0 ]; then
        echo "[$timestamp] 连接失败：$TARGET ($METHOD)" | tee -a "$LOG_FILE"
        send_alert "连接失败：$TARGET ($METHOD)"
    else
        echo "[$timestamp] 连接成功：$TARGET ($METHOD)"
    fi
}

# 主程序入口
main() {
    show_title
    parse_arguments "$@"
    check_tools
    echo "日志文件：$LOG_FILE"
    echo "检测目标：$TARGET"
    echo "检测间隔：$INTERVAL 秒"
    echo "检测方式：$METHOD"

    while true; do
        check_connectivity
        sleep "$INTERVAL"
    done
}

main "$@"
